package com.youdianstar.app.util

import com.google.android.gms.maps.model.LatLng
import com.youdianstar.app.common.ex.toJson
import com.youdianstar.app.common.util.CacheUtil
import com.youdianstar.app.common.util.DataManager
import com.youdianstar.app.common.util.GsonUtil
import com.youdianstar.app.common.util.StrUtil
import com.youdianstar.app.common.network.LocalCookieJar
import com.youdianstar.app.entity.AccountToken
import java.lang.Exception


/**
 * File: DataAppManager
 * Author: 82149 Create: 2023/7/14 14:26
 * Changes (from 2023/7/14)
 * --------------------------------------------------
 * description:
 * ---------------------------------------------------
 *
 */
class DataAppManager: DataManager() {
    companion object {
        val instance by lazy { DataAppManager() }
    }

    //----------------经纬度----------------------------------------

    private var latlng : LatLng?=null

    //获取本地经纬度
    fun getLocalLatLng():LatLng{
        return if (null!=latlng)
            latlng as LatLng
        else {
            val cacheLatlng = CacheUtil.instance.getStringValue("latlng","")
            if (!StrUtil.isEmpty(cacheLatlng)){
                val localArray: List<String> = cacheLatlng.split(",")
                latlng = LatLng(localArray[0].toDouble(),localArray[1].toDouble())
            }
            latlng ?: getDefaultLatLng()
        }
    }

    //保存本地经纬度
    fun saveLocalLatLng(local : LatLng){
        this.latlng = local
        val cacheStr = local.latitude.toString()+","+local.longitude.toString()
        CacheUtil.instance.setStringValue("latlng",cacheStr)
    }

    /**
     * 获取默认经纬度（当无法获取用户位置时的备用值）
     * 注意：此方法仅作为fallback使用，正常情况下应该通过getLocalLatLng()获取用户真实位置
     * 默认经纬度 - 根据用户提供的URL
     * 纬度: 20.999962321862967, 经度: 105.95065545290709
     */
    fun getDefaultLatLng():LatLng{
        return LatLng(20.999962321862967, 105.95065545290709)
    }

    //-----------------------数据缓存 ----------------------------------

    /*商家中心 Image cache list*/
    var imageList = mutableListOf<String>()
    //商家中心 edt tag
    var shopEdtTag = 0
    //标识用户刷新
    var userUpdateTag = false
    //标识 租借扫码意图
    
    /**
     * 清空用户数据，包括cookie
     */
    fun clearUserWithCookies() {
        clearUser()
        // 清理所有cookie
        LocalCookieJar.getInstance().clearCookies()
    }
    var rentScanTag = false
    //标识 订单支付完毕-主页更新UI状态
    var rentEndTag = false
    //标识优惠券刷新
    var couponUpdateTag = false

    //店主入住加密数据
    var partnerLinkId :String = ""
    //分享邀请好友
    var friendLinkID :String = ""

    //奖励二维码 code
    var rewardTypeTx :String = ""
    var rewardCodeTx :String = ""

    //标识流水刷新
    var billUpdateTag = false
    //标识充电卡刷新
    var chargingUpdateTag = false
    //积分余额
    var pointBalance:Int = 0

    //----------------------指纹--------------------------------------------

    /**
     * 判断账号是否设置指纹认证
     *
     * @param account 国家/地区码+手机 ;邮箱
     */
    fun getNotifyFingerprint(account: String): Boolean {
        if (account == "0")
            return false
        return try {
            val json = CacheUtil.instance.getStringValue("fingerToken","")
            if (StrUtil.isEmpty(json))
                false
            else {
                val tokenRs = GsonUtil.jsonToBean(json, AccountToken::class.java)
                tokenRs.account == account && !StrUtil.isEmpty(tokenRs.token)
            }
        } catch (e : Exception){
            e.printStackTrace()
            false
        }
    }

    /**
     * 管理账号 指纹认证记录(只存最新的)
     *
     * @param account 国家/地区码+手机 ;邮箱 (24/04/28 改用户id 唯一)
     * @param token 用户登录 token
     * @param isSave 保存or删除
     */
    fun setNotifyFingerprint(account: String,token:String?=null, isSave: Boolean) {
        if (isSave) {
            CacheUtil.instance.setStringValue("fingerToken", AccountToken(account,token).toJson())
        } else {
            CacheUtil.instance.setStringValue("fingerToken", "")
        }
    }

    /**
     * 更新账号 指纹认证记录
     *
     * @param account 国家/地区码+手机 ;邮箱
     * @param token 用户登录 token
     */
    fun updateFingerprintToken(account: String,token:String){
        CacheUtil.instance.setStringValue("fingerToken", AccountToken(account,token).toJson())
    }

    fun lastFingerprintToken(): String? {
        return try {
            val json = CacheUtil.instance.getStringValue("fingerToken","")
            if (StrUtil.isEmpty(json))
                null
            else{
                val tokenRs = GsonUtil.jsonToBean(json, AccountToken::class.java)
                tokenRs.token
            }
        } catch (e : Exception){
            e.printStackTrace()
            null
        }
    }

    /**
     * 是否已经显示引导页 Gift
     */
    fun isShowGuideImg(): Boolean {
        val config = CacheUtil.instance.getStringValue("gif", "0")
        return config == "1"
    }

    /**
     * 引导页标记
     * @param isShow 是否展示
     */
    fun setShowGuideImg(isShow: Boolean) {
        CacheUtil.instance.setStringValue("gif", if (isShow) "1" else "0")
    }

    //是否已经显示开启指纹
    fun isShowTouchId():Boolean{
        val cacheShow = CacheUtil.instance.getIntValue("TouchId_Notify")
        return cacheShow ==1
    }

    fun updateShowTouchId(sId:Int){
        CacheUtil.instance.setIntValue("TouchId_Notify",sId)
    }
}